#include <cstdlib>
#include <iostream>
#include <vector>
#include "server_thread_aceptar.h"
#include "server_thread_cliente.h"
#include "server_thread_crear_partida.h"
#include "server_socket.h"
#include "../Modelo/Partida.h"
#include "../Modelo/ParserXML.h"
#define PORT 4321
#define RUTA "../ArchivosCampania" //arreglar luego.
#define LARGO 5
#define TIEMPOACTUALIZACION 30 //arreglar luego

using std::cout;
using std::endl;
using std::string;
using std::vector;

Server_thread_aceptar::Server_thread_aceptar(Server_socket* s, bool* correr){
	socket = s;
        correServer = correr;
}

Server_thread_aceptar::~Server_thread_aceptar(){
}

/* Ejecutar: funcion donde hay un bucle para aceptar conexiones. */
void Server_thread_aceptar::ejecutar(){        
        int tiempoActualizacion = TIEMPOACTUALIZACION;
        vector<Partida*> *listaPartidas = new vector<Partida*>;
        vector<Jugador*> *listaJugadores = new vector<Jugador*>;
        vector<Partida*> *listaDePartidasPendientes = new vector<Partida*>;
        /* Levanta archivo de campaña en memoria (leer cada archivo de campania).*/
        ParserXML parser;
        vector<string> datosCampania = parser.cargarDatos(RUTA);
        /* Pone info de campañas en un string que va a recibir el cliente. */
        string infoCampanias = generarInfoDeCampanias(datosCampania);
        /* Lanzo thread que crea partidas.*/
        Server_thread_crear_partida* thread;
        thread->setFlagCorrer(correServer);
        thread->setPartidasPendientes(listaDePartidasPendientes);
        thread->iniciar();       
	while(correServer){
		Server_socket* nuevo_socket = new Server_socket(PORT);
		lista_sockets.push_back(nuevo_socket);
		if (socket->aceptar_conexion(nuevo_socket) == -1){
                    continue;
		}
		Server_thread_cliente* thread_cliente = new Server_thread_cliente(socket, nuevo_socket);
		lista_threads.push_back(thread_cliente);
                thread_cliente->setFlagCorrer(correServer);
                thread_cliente->setListaPartidas(listaPartidas);
                thread_cliente->setListaJugadores(listaJugadores);
                thread_cliente->setInfoCampanias(infoCampanias);
		thread_cliente->iniciar(); //lanza hilo de cliente.
	}
	// join y destroy de hilos.	
	for(unsigned int i = 0; i < lista_threads.size(); i++){
		lista_threads[i]->join();
		delete lista_threads[i];
	}
}


string Server_thread_aceptar::generarInfoDeCampanias(vector<string> info){
    //extrae los primeros 4 strings, los concatena separados por un '|' y le agrega el largo al principio.
    string buffer;
    string pipe = "|";
    for (unsigned int i = 0; i < 4; i++){
        buffer.append(pipe);
        buffer.append(info[i]);
    }
    int largo = buffer.size() + 1;
    char formatted_str[LARGO];
    snprintf(formatted_str, LARGO, "%.4d", largo);//
    string bufferFinal = string(formatted_str);
    bufferFinal.append(buffer);
    return bufferFinal;        
}